
/***************************************************************
Copyright © 206cd Co., Ltd. 1998-2029. All rights reserved.
文件名		: drm_plane_drv.c
作者	  	: gaoweijun
版本	   	: V1.0
描述	   	: drm plane驱动测试文件。
其他	   	: 无
日志	   	: 初版V1.0 2021/10/12 创建
***************************************************************/

#include <errno.h>
#include <fcntl.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <time.h>
#include <unistd.h>
//#include <sprintf.h>
#include "drm_plane_drv.h"

struct drm_plane plane[10];

void fill_color16(short *fb_addr, short bit_map, int psize)
{
    int i;
    for(i=0; i<psize; i++) {
        *fb_addr = bit_map;
        fb_addr++;
    }
}
void fill_color24(char *fb_addr, unsigned int bit_map, int psize)
{
    int i;
    char *p=fb_addr;
    for(i=0; i<psize; i++) {
        *p =bit_map ;
        p++;
        *p =bit_map >>8 ;
        p++;
        *p =bit_map >>16 ;
        p++;
    }
}

//DRM_FORMAT_RGBA8888=bgra,byte0:blue,byte1:green,byte2:red,byte3:alpha
void fill_color32(char *fb_addr, unsigned int bit_map, int psize)
{
    int i;
    char *p=fb_addr;
    for(i=0; i<psize; i++) {
        *p =bit_map ;
        p++;
        *p =bit_map >>8 ;
        p++;
        *p =bit_map >>16 ;
        p++;
        *p =bit_map >>24 ;
        p++;
    }
}
char test_rgb[1920*720*3];
char test_argb[1920*720*4];

drm_card dp_card;
drm_card hdmi_card;
int main(int argc, char **argv)
{
    setvbuf(stdout,NULL,_IOLBF,0);

    drm_card_init(&hdmi_card,"/dev/dri/card0");
    drm_card_init(&dp_card,"/dev/dri/card1");

//打印drm分层信息。包括层id以及对应层支持的显示格式。
// crtc id : 38
// Planes:
// id	crtc	fb	CRTC x,y	x,y	gamma size	possible crtcs
// 33	0	0	0,0		0,0	0       	0x00000001
//   formats: NV12
// 34	0	0	0,0		0,0	0       	0x00000001
//   formats: NV12
// 35	0	0	0,0		0,0	0       	0x00000001
//   formats: NV12
// 36	0	0	0,0		0,0	0       	0x00000001
//   formats: BG24
// 37	38	48	0,0		0,0	0       	0x00000001
//   formats: RG24
    drm_card_print_info(hdmi_card);
    drm_card_print_info(dp_card);

    set_crtc_mode(dp_card,0);

//    while(1);

//设置drm分层的透明度属性。
//    drm_alpha_init(hdmi_card);
//    drm_set_plane_prop(hdmi_card.fd, 33, "alpha", 180);//yuv
//    drm_set_plane_prop(hdmi_card.fd, 33, "alpha", 250);//yuv

//    drm_alpha_init(dp_card);
//    drm_set_plane_prop(dp_card.fd, 39, "g_alpha_en", 1);//yuv
//    drm_set_plane_prop(dp_card.fd, 39, "alpha", 128);//yuv

//    init_plane(&plane[0],34,40,1280,720,0,0,DRM_FORMAT_NV12);

//初始化plane[0]，绑定drm显示plane id：33,crtc id：38，plane层大小为1280x720，plane层位置为0，0.plane层格式为DRM_FORMAT_NV12
//  dp plane resolution must 1920x1080
      init_plane(&plane[0],dp_card,39,1920,1080,0,0,DRM_FORMAT_RGB888);
      init_plane(&plane[1],hdmi_card,33,1280,720,0,0,DRM_FORMAT_RGB888);

//    sleep(5);
//每次重新设置plane属性（显示大小，位置等信息），都需要重新init plane。
//    plane_destroy(&plane[0]);
//    plane_destroy(&plane[1]);
//    sleep(3);
//    init_plane(&plane[0],33,480,360,360,0,DRM_FORMAT_NV12);
//    fill_color24(test_rgb,0x0000ff,1280*720);
//    fill_color32(test_argb,0xff0000ff,480*720);

      fill_color24(test_rgb,0x0000ff,1920*1080);
//      for(int i=0;i<1080;i++){
//          memcpy(plane[0].bo[0].vaddr+i*plane[0].bo[0].pitch,test_rgb,1920*1*3);
//      }
      plane_double_fb_cpy(&plane[0],test_rgb,1920*1080*3);
      sleep(1);

      while(1);

//更新plane[0]的显存空间。
//blue
    fill_color24(test_rgb,0x0000ff,1280*720);
    plane_double_fb_cpy(&plane[0],test_rgb,1280*720*3);
    sleep(1);
//green
    fill_color24(test_rgb,0x00ff00,1280*720);
    plane_double_fb_cpy(&plane[0],test_rgb,1280*720*3);
    sleep(1);
//red
    fill_color24(test_rgb,0xff0000,1280*720);
    plane_double_fb_cpy(&plane[0],test_rgb,1280*720*3);
    sleep(1);

    while(1){
        sleep(1);
    }
    return 0;
}
